/**
 * Object.assgin(obj1,obj2,...)  //合并对象
 * 
 * 它会修改第一个对象，把第一个对象返回
 * 
 * 返回值：第一个对象
 * 
 * Object.assgin({},obj1,obj2...)
*/

let obj = {
    name:'lili',
    age:18
};

//遍历的是可枚举的属性
for(let key in obj){
    console.log(key);
}

console.log(Object.getOwnPropertyDescriptor(obj,'name'));

/**
 * {
 *  value: "lili",      属性值
 *  writable: true,     是否可修改
 *  enumerable: true,   是否可枚举
 *  configurable: true  是否可配置
 * }
 * */ 

 Object.defineProperty(obj,'name',{
    enumerable:false,
    writable:false,
    value:'zs',
    configurable:true
 })

//  obj.name="zs";

delete obj.name

 console.log(obj);

//  for(let key in obj){
//     console.log(key);
// }

console.log(Object.keys(obj))   //可枚举的键组成数组
console.log(Object.values(obj)) //可枚举的键组成数组
console.log(Object.entries(obj)) //可枚举的键值组成数组  [['age',18],['name','zs']]

// Object.is()  //NaN  +0 -0  ===

// for... of...   数组  类数组  set map

// Set 类似于数组，没有重复的值   Map  类似对象  不限于字符串，各种类型的值（包括对象）都可以当作键

/**
 * 1>参数只有一个参数()可以省略
 * 
 * 2> {} 值有一句代码时 {}可以省略
 * 
 * 3> 省略了{} 相当于在代码前加上return
*/
let getDom = eleClass => Array.from(document.querySelectorAll(eleClass))

console.log(getDom('.str'));

var colors=["red","green","blue"];

// new Array()

Array.prototype.inArray = (...params) => {  //rest参数  必须放在最后  剩余所有参数  -- >数组
    console.log(params)
    return params[1].findIndex((item) => item === params[0]);
}

console.log(colors.inArray('blue',colors));

/**
 * 箭头函数的三个特点：
 * 
 * 1>不可以当做构造函数
 * 
 * 构造函数和普通函数的区别：构造函数用new调用
 * 
 * 2>没有arguments   ...
 * 
 * 3>this 指向问题   ES6 this ---> 定义函数所在的对象   ES5 this ---> 调用对象
 * 
*/

// function es5Fun(){
//     console.log(arguments);
// }

// es5Fun('green',colors)

let count = 0;  //不会成为window的属性

let m = 2;
let obj1 = {
    count:1,
    add(){
        let setCount1 = function(){
            console.log(this);    //window

            console.log(this.count); //undefined
        }

        let setCount2 = () => {
            console.log(this);  //obj

            console.log(this.count); //1
        }

        setCount1() 
        
        setCount2()
    }
}

obj1.add();

/**
 * es5 
 * 
*/

function ajax(type='get'){
    // if(type){
    //     type = type
    // }else{
    //     type = 'get'
    // }

    // type = type || 'get';

    console.log(type);
}

ajax('post')

let login = ({name='lisi',age=10}) => {
    console.log(name,age);
}

login({})


let arr1 = ['item1','item2','item3','item4','item5'];

let arr2 = [
    {
        content:'selection1',
        index:0
    },
    {
        content:'selection2',
        index:2
    }
]

//['selection1','item1','item2','selection2','item3','item4','item5']

//flat  [[[]]]

let fun = (arr1,arr2) => {
    arr2.forEach((item) =>{
        arr1[item.index] = [item.content,arr1[item.index]]
    })
    return arr1.flat();

    // arr2.forEach((item,index) => arr1.splice(item.index+index,0,item.content))
    // return arr1
}

console.log(fun(arr1,arr2));





















